#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <vector>
#include <cstdio>
#include <functional>
// int count = 0;
//  //////////func////////////
//  void Sched()
//  {
//      std::cout << "我是进程调度" << std::endl;
//  }
//  void MemManger()
//  {
//      std::cout << "我是周期性的内存管理，正在检查有没有内存问题" << std::endl;
//  }
//  void Fflush()
//  {
//      std::cout << "我是刷新程序，我在定期刷新内存数据，到磁盘" << std::endl;
//  }
//  // /////////////////////////
//  using func_t = std::function<void()>;
//  std::vector<func_t> funcs;
//  int timestamp = 0;

// void handler(int signumber)
// {
//     // std::cout<<"count :" << count << std::endl;
//     // exit(0);
//     timestamp++;
//     std::cout << "##############################" << std::endl;
//       for(auto f : funcs)
//       {
//           f();
//       }
//       std::cout << "##############################" << std::endl;
//       int n = alarm(1);
// }

// int main()
// {
//     //int count = 0;
//     funcs.push_back(Sched);
//     funcs.push_back(MemManger);
//     funcs.push_back(Fflush);
//     signal(SIGALRM, handler);
//      alarm(1);
//     while (true)
//     {
//         // std::cout << "count : "
//         //           << count << std::endl;
//         //count++;
//         pause();
//     }
//     return 0;
// }

// void hander(int signumber)
// {
//     std::cout << "我是" << getpid() << ", 我获得了一个信号" << signumber << std::endl;
//     //std::cout << "发生除0错误" << std::endl;
//     //exit(13);
// }

// int main()
// {
//     //std::cout << "我是进程：" << getpid() << std::endl;

//     for (int i = 1; i <= 32; i++)
//     {
//         signal(i, hander);
//     }

//     // while (true)
//     // {
//     //     std::cout << "I am a process, I am waiting signal!" <<"pid = " << getpid()<< std::endl;
//     //     sleep(1);
//     //     raise(2);
//     // }

//     for (int i = 1; i <= 32; i++)
//     {
//         // signal(i, hander);
//         if (i == 9 || i == 19)
//             continue;
//         if(i == 6)
//           abort();//向目标进程发送6号信号，终止进程（通过恢复对信号的默认处理动作来终止进程）
//         raise(i);
//         sleep(1);
//     }
//     //验证了9号信号和19号信号不能被自定义捕捉
//     return 0;
// }

// using func_t = std::function<void()>;
// std::vector<func_t> gfuncs;

// void flush()
// {
//     std::cout << "**********刷新任务**************" << std::endl;
// }

// void print()
// {
//     std::cout << "**********打印任务**************" << std::endl;
// }

// void sched()
// {
//     std::cout << "**********调度任务**************" << std::endl;
// }

// void insert()
// {
//     gfuncs.push_back(flush);
//     gfuncs.push_back(print);
//     gfuncs.push_back(sched);
// }

// void hander(int signum)
// {
//     std::cout << "################################" << std::endl;
//     for (auto &f : gfuncs)
//     {
//         f();
//     }
//     std::cout << "################################" << std::endl;
//     alarm(1); //每隔1s让进程执行一些方法
// }

// int main()
// {
//     insert();
//     signal(SIGALRM, hander);
//     alarm(1);
//     while (1)
//     {
//         pause();
//     }

//     return 0;
// }

// void PrintPending(sigset_t &pending)
// {
//     printf("我是一个进程(%d), pending: ", getpid());
//     for (int signo = 31; signo >= 1; signo--)
//     {
//         if (sigismember(&pending, signo))
//             std::cout << "1";
//         else
//             std::cout << "0";
//     }
//     std::cout << std::endl;
// }

// void hander(int signum)
// {
//     std::cout<<"递达2号信号" << std::endl;
// }

// int main()
// {
//     signal(SIGINT, hander);
//     // 1、屏蔽2号信号
//     sigset_t block, oblock;
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     sigaddset(&block, SIGINT);
//     int n = sigprocmask(SIG_SETMASK, &block, &oblock);
//     (void)n;

//     int cnt = 0;
//     //4、重复获取打印过程
//     while (true)
//     {
//         // 1、获取pending信号集
//         sigset_t pending;
//         int m = sigpending(&pending);

//         // 3、打印
//         PrintPending(pending);

//         //4、解除对2号信号的阻塞
//         if(cnt == 10)
//         {
//             std::cout<<"解除对2号信号的阻塞" << std::endl;
//             sigprocmask(SIG_SETMASK, &oblock, nullptr);
//         }
//         sleep(1);
//         cnt++;
//     }
//      return 0;
// }

void handler(int sig)
{
    std::cout << "signal number: " << sig << std::endl;
    while (true)
    {
        // 不断获取pending表
        sigset_t pending;
        sigpending(&pending);
        for (int i = 31; i >= 1; i--)
        {
            if (sigismember(&pending, i))
                std::cout << "1";
            else
                std::cout << "0";
        }
        std::cout << std::endl;
        sleep(1);
    }
    exit(0);
}

int main()
{

    struct sigaction act, oact;
    act.sa_handler = handler;
    sigaction(SIGINT, &act, &oact); // 对2号信号进行捕捉

    while (1)
    {
        std::cout << "hello world! " << getpid() <<std::endl;
        sleep(1);
    }

    return 0;
}
